# -*- coding: utf-8 -*

from __future__ import division
import sys
import csv
import math


def calcular_entropia(fuente_de_informacion):
    entropia = 0
    for probabilidad in fuente_de_informacion.itervalues():
        entropia = entropia + probabilidad*(math.log((1/probabilidad), 2))

    return entropia


if __name__ == '__main__':
    registros = []
    csv_reader = csv.reader(sys.stdin, delimiter=',')
    for row in csv_reader:
        if 'Who has' in row[6]:
            timestamp = row[1]
            ip_solicitada = row[6].split('?')[0][8:]
            registros.append((timestamp, ip_solicitada))

    with open('output.csv', 'wb') as output:
        writer = csv.writer(output, delimiter=',')
        
        total = 0
        ocurrencias = {}
        probabilidades = {}

        for tupla in registros:
            total = total + 1

            # Recalcula el número de ocurrencias y probabilidades para cada IP
            for ip in ocurrencias:
                if ip == tupla[1]:
                    ocurrencias[ip] = ocurrencias[ip] + 1
                    
                probabilidades[ip] = ocurrencias[ip]/total

            # Lo agrega en caso de que no haya aparecido antes
            if tupla[1] not in ocurrencias:
                ocurrencias[tupla[1]] = 1
                probabilidades[tupla[1]] = ocurrencias[tupla[1]]/total

            # Calcula la entropía de la fuente de información
            entropia = calcular_entropia(probabilidades)

            # Calcula la cantidad de información del router
            # Definir cuál es la IP sobre la cuál se quiere hacer incapié
            router_ip = '192.100.100.88'
            if router_ip in probabilidades:
                router_informacion = math.log((1/probabilidades[router_ip]), 2)
            else:
                router_informacion = 0

            writer.writerow([tupla[0], entropia, router_informacion])
